package cn.com.code.generator.thread;

import java.util.UUID;

/**
 * @Author: hongqi
 * @Date: 2020/7/7 14:15
 * @Description:    多线程标志类
 */
public class MultiEndFlag {
    //是否解雇，默认没解雇
    private volatile boolean fired = false;
    //是否执行成功
    private volatile boolean isAllSuccess = false;
    //线程总数
    private volatile int threadCount = 0;
    //失败的线程总数
    private volatile int failCount = 0;

    /**
     * 初始化子线程的总数
     * @param count
     */
    public MultiEndFlag(int count){
        threadCount = count;
    }

    public boolean isAllSuccess() {
        return isAllSuccess;
    }

    /**
     * 等待全部结束
     * @param threadId
     * @param result
     */
    public synchronized void waitForEnd(UUID threadId, int result){
        //统计失败的线程个数
        if(result==0){
            failCount++;
        }
        //否则线程--，如果解雇不为true，当前线程就wait，等待唤醒通知，当减到0的时候，唤醒全部notifyAll
        threadCount--;
        while (!fired){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 执行结束通知
     * 当线程全部执行结束后，把解雇改成true
     * isAllSuccess=所有线程是否全部都执行成功
     * 无论是否全部执行成功都唤醒线程
     */
    public synchronized void go(){
        fired = true;//当线程全部执行结束后，把解雇改成true
        //结果都显示成功
        isAllSuccess = (failCount == 0);
        notifyAll();
    }
    /**
     * 等待结束
     */
    public void end(){
        //如果线程没有全部执行完毕，就调用Thread的sleep睡眠方法，直到线程全部执行结束
        while (threadCount > 0){
            waitFunc(50);
        }
        System.out.println("线程全部执行完毕通知");
        go();
    }

    /**
     * 等待
     */
    private void waitFunc(long millis){
        try {
            Thread.sleep(millis);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
